# import easygui as g

#安装方式： pip install pyMuPDF
import fitz
#安装方式：pip install baidu-aip
from aip import AipOcr
from PyPDF2 import PdfFileReader, PdfFileWriter
import os
from tkinter import *


'''
需求：
根据pdf的内容，重命名pdf文件。
eg：
1.文件内容为： 我是小明的爸爸，我是明爸 
2.那么读取配置文件的 startKey：我是  endKeyKey：的爸爸，
3.根据startKey和endKeyKey，截取内容“小明”作为新的文件名
4.重命名文件名
readme：已经完成，详细内容，请看work函数
'''





#定义全局变量
APP_ID=""
API_KEY=""
SECRECT_KEY=""
STARTKEY=""
ENDKEY=""



#TODO 请在metainfo.txt修改自己的ocr的API_KEY和SECRECT_KEY，申请地址https://ai.baidu.com/ai-doc/OCR/wkibizyjk  https://login.bce.baidu.com/?account=&redirect=http%3A%2F%2Fconsole.bce.baidu.com%2Fai%2F#/ai/ocr/app/list
#读取配置文件，初始化全局变量
def initGlobalVarFromFile():
    with open('metaInfo.txt', 'r', encoding='utf-8') as t:
        txt=t.readlines()
        # print(txt)

        global APP_ID
        global API_KEY
        global SECRECT_KEY
        global STARTKEY
        global ENDKEY

        # 从配置文件读取全局变量信息并修改全局变量
        APP_ID=txt[0].split("=")[-1].strip()
        API_KEY=txt[1].split("=")[-1].strip()
        SECRECT_KEY=txt[2].split("=")[-1].strip()
        STARTKEY=txt[3].split("=")[-1].strip()[1:-1]
        ENDKEY=txt[4].split("=")[-1].strip()[1:-1]

        # print("打印配置信息：")
        # print(APP_ID,API_KEY,SECRECT_KEY,STARTKEY,ENDKEY)

#深度遍历文件夹里面的所有pdf，包括子目录
def findAllPdfFiles(dirPath):
    fileList = []
    pdf_files = list(os.scandir(dirPath))
    for item in pdf_files:
        if item.path.endswith('.pdf'):
            fileList.append(item.path)
    return fileList

# 如果没有文件夹创建文件夹
def mkdir(path):
    folder = os.path.exists(path)
    if not folder:  # 判断是否存在文件夹如果不存在则创建为文件夹
        os.makedirs(path)  # makedirs 创建文件时如果路径不存在会创建这个路径


#如果没有文件创建文件
def mkfile(path):
    if not os.path.exists(path):
        #mknod window不支持
        # os.mknod(path)
        with open(path, "a+") as fp:
            return ""


#百度的OCR HTTP形式，需要网络
#返回值例子:{'words_result': [{'words': '江西省建设工程有限公司'}, {'words': '请款报告'}, {'words': '致：东莞市石鼓污水处理有限公司'}, {'words': '就凤岗镇截污主干管网342等检查井维修工程（合同编号：'}, {'words': '0722-177FE793GZB-2-071),我方按《东莞市石鼓污水处理有限公司截'}, {'words': '污管网（含配套泵站基础设施）及运营项目维修、整改及应急抢险协议'}, {'words': '资格采购项目采购合同》第二部分通用合同条款第81.1条第5小条，'}, {'words': '经贵司竣工验收合格并结算审核后总金额为17,083.18元，现缺陷责任'}, {'words': '期到期，申请支付至100%工程结算款。现申请工程结算款17,083.18'}, {'words': '元。'}, {'words': '附：'}, {'words': '名称：江西省建设工程有限公司'}, {'words': '纳税人识别号：913600001582693842'}, {'words': '开户银行及账号：兴业银行东莞分行营业部'}, {'words': '395000100100324695'}, {'words': '地址：江西省南昌市红谷滩新区会展路135号中顺大厦27楼'}, {'words': '联系人：刘娟'}, {'words': '电话：13790665022'}, {'words': '江'}, {'words': ':'}, {'words': '江西省建设工程有限公司'}, {'words': '情况属实，同意支'}, {'words': '苏伟周云'}, {'words': '70262'}], 'words_result_num': 24, 'log_id': 1554822867044980466}
def baiduOCR(picfile):
    # APP_ID = '自行填写'                     # 申请应用获取的 ID，下同  链接：https://ai.baidu.com/tech/ocr/general
    # API_KEY = '自行填写'
    # SECRECT_KEY = '自行填写'

    #引用全局变量
    global APP_ID
    global API_KEY
    global SECRECT_KEY

    client=AipOcr(APP_ID, API_KEY, SECRECT_KEY)
    image=open(picfile, 'rb')
    rb_data=image.read()
    message=client.basicAccurate(rb_data)  # 通用文字高精度识别，每天 500 次免费
    image.close()
    return message


#聚合百度的json返回值
#有个问题，有些标点符号中英文识别可能不准确，比如，,
def agg_baidu_ocr_res(ocr_res):
    words_result = ocr_res["words_result"]
    agg_res = ""
    for res in words_result:
        agg_res += res['words']
    # print(agg_res)
    # 统一换成中文的，
    agg_res= agg_res.replace(",","，")
    return agg_res




#读取pdf文件的第一页，生成新的pdf
def getPdfPage1(pdf_file):
    read_PDF=PdfFileReader(pdf_file)
    write_pdf=PdfFileWriter()  # 实例化对象
    write_pdf.addPage(read_PDF.getPage(0))  # 将遍历出的每一页添加到实例化对象中
    #新的pdf文件路径
    pdf_path=f'{os.path.dirname(pdf_file)}\\tempFileDir\\tempFile.pdf'

    with open(pdf_path, "wb") as b:
        write_pdf.write(b)
    return pdf_path



#pyMuPDF 一堆报错，解决一个，还会有另一个，
#读取pdf文件第一个文件，生成一个png文件，用于ocr识别
def pyMuPDF_fitz(pdfPath):
    imagePath=os.path.dirname(pdfPath)
    pdfDoc=fitz.open(pdfPath)
    page=pdfDoc[0]
    rotate=int(0)
    # 每个尺寸的缩放系数为1.3，这将为我们生成分辨率提高2.6的图像。
    # 此处若是不做设置，默认图片大小为：792X612, dpi=96
    zoom_x=1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)
    zoom_y=1.33333333
    mat=fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
    pix=page.getPixmap(matrix=mat, alpha=False)
    if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
        os.makedirs(imagePath)  # 若图片文件夹不存在就创建
    png_path=imagePath+'\\tempPicture.png'

    mkfile(png_path)

    pix.writePNG(png_path)  # 将图片写入指定的文件夹内
    return png_path




def getNewFileName(agg_res):
    print(agg_res)
    print(STARTKEY)
    print(ENDKEY)

    startIndex = agg_res.index(STARTKEY) + len(STARTKEY)
    lastIndex = agg_res.index(ENDKEY)

    newName = agg_res[startIndex:lastIndex]
    # print(newName)
    return newName

#重命名文件
def renamePdfFile(pdf_file_path, new_file_name):
    new_path=f'{os.path.dirname(pdf_file_path)}\\{new_file_name}.pdf'
    os.rename(pdf_file_path, new_path)
    return new_path


'''
集成所有功能：识别某个pdf文件，截取文件中的某个内容作为新的文件名，重命名该pdf文件
思路：
1.获取pdf文件     
2.生成pdf文件第一页  getPdfPage1
3.截图pdf第一页  pyMuPDF_fitz 
3.百度OCR识别截图，得到识别文字 baiduOCR
4.通过前后关键字，截取前后关键字的中间内容 getNewFileName
5.重命名pdf文件 renamePdfFile
'''
def work(pdf_path):
    pdfPage1Path = getPdfPage1(pdf_path)
    png_path = pyMuPDF_fitz(pdfPage1Path)
    ocr_str = baiduOCR(png_path)
    agg_res = agg_baidu_ocr_res(ocr_str)
    newFileName = getNewFileName(agg_res)
    renamePdfFile(pdf_path,newFileName)


#扫描目录下的所有pdf文件，调用work方法重命名pdf文件
def workAll(dirPath):
    filePathList = findAllPdfFiles(dirPath)
    for filePath in filePathList:
        try:
            work(filePath)
        except:
            print(filePath+"重命名失败，没有正确获取到新文件名！！！")




if __name__=='__main__':
    initGlobalVarFromFile()

    dirPath = r'D:\hjx\project\python\python-test\根据PDF内容批量修改文件名\files'
    filePath = r'D:\hjx\project\python\python-test\根据PDF内容批量修改文件名\files\月租金.pdf'

    # gui()

    # workAll(dirPath)
    # filePathList = findAllPdfFiles(r'D:\hjx\project\python\python-test\根据PDF内容批量修改文件名\files')
    # for filePath in filePathList:
    #     print(filePath)

    # workAll(r'D:\hjx\project\python\python-test\根据PDF内容批量修改文件名\files')

    work(filePath)









